#pragma once

class CThread
{
protected:
	HANDLE hThread;
	unsigned int threadID;
	HANDLE hTerminateEvent;

public:
	CThread();
	virtual ~CThread();

	//function methods
	virtual bool start( bool suspended = false );	//starts a thread
	virtual void stop( unsigned long exitCode = 0 );//stops a thread
	virtual unsigned long run() = 0;				//user puts actual code here
	virtual unsigned long suspend();				//suspend it
	virtual unsigned long resume();					//resume it
	virtual bool notifyTerminate();					//notify thread that its time to terminate

	//state get methods
	virtual unsigned long getID();					//get system-wide unique ID
	virtual HANDLE getHandle();						//get the handle
	virtual int getPriority();						//get priority
	virtual unsigned long getExitCode();			//get the exit code - returns
													//STILL_ACTIVE if well, still active!

	//state set method
	virtual bool setPriority( int priority );		//set priority

	//global state query methods
	static unsigned long getCurrentID();			//get pseudo-thread id
	static HANDLE getCurrentHandle();				//get pseudo-thread handle

	static void sleep( unsigned long msecs );		//sleep for _msecs_ milliseconds
};
